package ecg.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class FileService extends ActionSupport
{
	private String filePath;
	private String fileName;
	private String picName1;
	private String contentType;
	private String contentDisposition;
	private InputStream inputStream;
	private long contentLength;
	
	/**
	 * 디렉토리가 존재하지 않는다면 디렉토리 생성.
	 * @param path
	 */
	private void makeBasePath(String path)
	{
		File dir = new File(path);
		if(!dir.exists())
		{
			dir.mkdirs();
		}
	}
	
	/**
	 * 파일업로드.
	 *
	 */
	public String saveFile(File upload, String basePath, String fileName) throws IOException
	{
		File saveFile;
		String realFileName = fileName;
		if(upload == null || upload.getName().equals("") || upload.length() <= 0)
		{
			return null;
		}
		
		// 베이스 폴더 생성
		this.makeBasePath(basePath);
		
		// 저장할 전체 경로 생성
		String saveFullPath = basePath + "/" + fileName;
		
		saveFile = new File(basePath + fileName); // 업로드 된 파일의 경로와 파일명으로 파일 객체 생성.
		
		// 업로드된 파일이 존재하는경우
		if(saveFile.exists())
		{

			String fileSurffix = Time.getDateTimeSerial();
			String fileExtension = fileName.substring(fileName.lastIndexOf(".")); // 확장자 분리

			String fileReName = fileName.replace(fileExtension, "_" + fileSurffix + fileExtension); // 확장자에 날짜를 추가해서 파일명 중복 방지.
	
			saveFile = new File(basePath + fileReName);
			
			realFileName = fileReName;
			
		}
		FileUtils.copyFile(upload, saveFile); // 현재 업로드 된 파일을 saveFile 객체로 복사.

		return realFileName;
	}
	
	/**
	 * 허용된 컨텐츠 타입 반환.
	 * @return
	 */
	public List<String> getAllowContentTypeList()
	{
		List<String> allowContentTypeList = new ArrayList<String>();
		
		allowContentTypeList.add("application/haansofthwp");
		allowContentTypeList.add("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
		allowContentTypeList.add("application/vnd.ms-excel");
		allowContentTypeList.add("application/vnd.ms-powerpoint");
		allowContentTypeList.add("application/vnd.openxmlformats-officedocument.presentationml.presentation");
		allowContentTypeList.add("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
		allowContentTypeList.add("application/pdf");
		allowContentTypeList.add("image/x-png");
		allowContentTypeList.add("image/png");
		allowContentTypeList.add("image/pjpeg");
		allowContentTypeList.add("image/jpeg");
		allowContentTypeList.add("image/gif");
		allowContentTypeList.add("image/bmp");
		
		return allowContentTypeList;
	}
	
	public List<String> getAllowContentTypeList2()
	{
		List<String> allowContentTypeList = new ArrayList<String>();
		
		allowContentTypeList.add("image/x-png");
		allowContentTypeList.add("image/png");
		allowContentTypeList.add("image/pjpeg");
		allowContentTypeList.add("image/jpeg");
		allowContentTypeList.add("image/gif");
		allowContentTypeList.add("image/bmp");
		
		return allowContentTypeList;
	}
	
	/**
	 * 컨텐츠 타입 밸리데이션 체크.
	 */
	public boolean contentTypeValidate(String contentType)
	{
		List<String> listContentType = this.getAllowContentTypeList();
		
		if(contentType != null)
		{
			for(int i=0; i < listContentType.size(); i++)
			{
				if(contentType.equals(listContentType.get(i)))
				{
					return true;
				}
			}
			
			return false;
		}
		
		return true;
	}
	public boolean contentTypeValidate2(String contentType)
	{
		List<String> listContentType = this.getAllowContentTypeList2();
		
		if(contentType != null)
		{
			for(int i=0; i < listContentType.size(); i++)
			{
				if(contentType.equals(listContentType.get(i)))
				{
					return true;
				}
			}
			
			return false;
		}
		
		return true;
	}
	
	/**
	 * 파일 다운로드
	 * @return
	 * @throws Exception
	 */
	public String executeDownload() throws Exception
	{
		String result = SUCCESS;
		String filePathPrefix = getText("path.upload.prefix");
		String fileFullPath = "";
		if(fileName != null) {
			fileFullPath = filePathPrefix + filePath + fileName;
		} else if(picName1 != null) {
			fileFullPath = filePathPrefix + filePath + picName1;
		}
		System.out.println("경로: " + filePath);
		System.out.println("이름: " + fileName);
		System.out.println("풀경로: " + fileFullPath); 
		
		// 파일을 읽어온다.
		File f = new File(fileFullPath);
		
		
		if(f.length() > 0)
		{
			// 파일의 크기 저장.
			this.setContentLength(f.length());
			System.out.println("파일크기 : " + f.length());
			// 다운로드 받을 파일의 이름을 지정.
			//if(fileName != null) {
			this.setContentLength((int)f.length());
			this.setContentDisposition("attachment;filename=" + new String(fileName.getBytes("MS949"),"ISO8859_1")+";");
			//this.setContentDisposition("attachement; fileName=" + URLEncoder.encode(fileName, "UTF-8"));
			//} else if(picName1 != null){
			//	this.setContentDisposition("attachement; picName1=" + URLEncoder.encode(picName1, "UTF-8"));
			//}
			this.setInputStream(new FileInputStream(f));
		}
		else
		{
			// 파일이 존재하지 않을 경우. 에러 페이지로 포워딩한다.
			result = ERROR;
		}
		
		return result;
	}

	/**
	 * 파일 삭제
	 * @return
	 */
	public void deleteFile(String fileFullPath)
	{
		System.out.println("****("+fileFullPath);
		File saveFile = new File(fileFullPath);
		
		saveFile.delete();
	}
	
	public String getFilePath()
	{
		return filePath;
	}

	public void setFilePath(String filePath)
	{
		this.filePath = filePath;
	}

	public String getFileName()
	{
		return fileName;
	}

	public void setFileName(String fileName)
	{
		this.fileName = fileName;
	}

	public String getPicName1() {
		return picName1;
	}

	public void setPicName1(String picName1) {
		this.picName1 = picName1;
	}

	public String getContentType()
	{
		return contentType;
	}

	public void setContentType(String contentType)
	{
		this.contentType = contentType;
	}

	public String getContentDisposition()
	{
		return contentDisposition;
	}

	public void setContentDisposition(String contentDisposition)
	{
		this.contentDisposition = contentDisposition;
	}

	public InputStream getInputStream()
	{
		return inputStream;
	}

	public void setInputStream(InputStream inputStream)
	{
		this.inputStream = inputStream;
	}

	public long getContentLength()
	{
		return contentLength;
	}

	public void setContentLength(long contentLength)
	{
		this.contentLength = contentLength;
	}
}
